package model

import java.util.List
import java.util.Random

class Pais {
	
	  @Property var String nombre
	  @Property val List<Lugar> lugaresInteresantes = newArrayList
	  @Property val List<String> caracteristicas = newArrayList
	  @Property val List<Pais> conexionesAereas = newArrayList

		override def toString(){
			this.nombre
		}
	
	   def equals(Pais p){
	  	p.nombre.equals(this.nombre)
	  }
	  
	  
	  /**
	   * Proposito: Agrega una caracteristica al pais
	   */
	  def  agregarCaracteristica(String nuevaCaracteristica ){ 	
	  	this.caracteristicas.add(nuevaCaracteristica)
		}
	  /**
	   * Proposito: Quita una caracteristica del pais
	   */
	  def quitarCaracteristica(String caracteristica){
	  	
	  	this.caracteristicas.remove(caracteristica)
		}
	  /**
	   * Proposito: Agrega un lugar de interes al pais
	   */
	  def agregarLugarInteresante(Lugar lugar){
	  	
	  	if(this.lugaresInteresantes.size < 3)
	  		this.lugaresInteresantes.add(lugar)
	  	else
	  		throw new RuntimeException("Solo puede agregar tres lugares.")
		}
		
	  /**
	   * Proposito: Quita un lugar interesante del pais
	   * 
	   */
	  def quitarLugarInteresante(Lugar lugar){
	  	this.lugaresInteresantes.remove(lugar)
	  }

	  /**
	   * Proposito: Agrega un pais que se usa como conexion
	   */
	  def agregarConexionAerea(Pais conexion){
	  	this.conexionesAereas.add(conexion)
	  	}

	  /**
	   * Proposito: Quita un pais que se usa como conexion
	   * 
	   */
	  def quitarConexionAerea(Pais conexion){
	  	this.conexionesAereas.remove(conexion)
	  	}
	 
	
	def informarQueElVillanoLlego(Ruta rutaElegida, Villano villano) {
		this.lugaresInteresantes.forEach[habilitarPistas(rutaElegida.paisSiguiente, villano)]
	}
	  	 
	def informarQueElVillanoSeFue() {
		this.lugaresInteresantes.forEach[deshabilitarPistas]
	}


	def finalizoRuta(Villano v) {
		this.lugaresInteresantes.forEach[ultimaParada]
		this.lugaresInteresantes.get(randInt(0, this.lugaresInteresantes.size)).setVillanoOn(v)
	}
	
	
	def Pais darConexionPosible() {
		// Corroborar que el random este entre la cantidad de conexiones posibles.
		this.conexionesAereas.get(randInt(0, this.conexionesAereas.size))
			}
	
	
		private def int randInt(int min, int max) {

    // NOTE: Usually this should be a field rather than a method
    // variable so that it is not re-seeded every call.
    val Random rand = new Random()

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    val int randomNum = rand.nextInt((max - min)) + min

    return randomNum

}


}